package com.kbs.im.common.protocol.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

/**
 * 消息魔数校验
 * 用以确认接收到的消息是否是自定协议的消息
 * 若是，则传入channelpipline进行解码等后续处理
 * 若不是，则丢弃消息
 *
 * @author zhangzhang
 */
public class Spliter extends LengthFieldBasedFrameDecoder {

    /**
     * 长度域在消息中的偏移量，单位：字节
     */
    private static final int LENGTH_FIELD_OFFSET = 10;

    /**
     * 长度域的长度，单位：字节
     */
    private static final int LENGTH_FIELD_LENGTH = 4;

    public Spliter() {
        super(Integer.MAX_VALUE, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH);
    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
        if (in.getInt(in.readerIndex()) != PacketCodec.MAGIC_NUMBER) {
            ctx.channel().close();
            return null;
        }
        return super.decode(ctx, in);
    }
}
